package base

import (
	"context"

	"gorm.io/gorm"
)

func (d *Data) InTx(ctx context.Context, fn func(ctx context.Context) error) error {
	return d.Mysql.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
		ctx = context.WithValue(ctx, contextTxKey{}, tx)
		return fn(ctx)
	})
}

func (d *Data) Tx(ctx context.Context) (*gorm.DB, context.Context) {
	tx := d.Mysql.Begin()
	ctx = context.WithValue(ctx, contextTxKey{}, tx)
	return tx, ctx
}

func (d *Data) DB(ctx context.Context) *gorm.DB {
	tx, ok := ctx.Value(contextTxKey{}).(*gorm.DB)
	if ok {
		return tx.WithContext(ctx)
	}
	return d.Mysql.WithContext(ctx)
}

func (t *Data) Create(ctx context.Context, model interface{}) error {
	return t.DB(ctx).Create(model).Error
}

func (t *Data) Save(ctx context.Context, model interface{}) error {
	return t.DB(ctx).Save(model).Error
}

func (t *Data) Delete(ctx context.Context, model interface{}) error {
	return t.DB(ctx).Delete(model).Error
}
